/** @file nim_global_def.h
 * @brief 辅助能力 接口相关的常量函数等定义头文件
 * @copyright (c) 2015-2017, NetEase Inc. All rights reserved
 * @author Harrison
 * @date 2015/2/1
 */

#ifndef NIM_SDK_DLL_EXPORT_HEADERS_NIM_GLOBAL_DEF_H_
#define NIM_SDK_DLL_EXPORT_HEADERS_NIM_GLOBAL_DEF_H_

#include "public_defines.h"

#ifdef __cplusplus
extern "C" {
#endif
/** @name json params for NIMResCode, see nim_res_code_def.h
 * @{
 */
/// int, NIMResCode
static const char* kNIMResCode = "err_code";
/** @}*/  // json params for NIMResCode, see nim_res_code_def.h

/** @typedef void (*nim_json_transport_cb_func)(const char *json_params, const void *user_data)
 * nim callback function with json parameters from sdk and user's data from app
 * @param[out] json_params 输出的json字符串内容
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_json_transport_cb_func)(const char* json_params, const void* user_data);

/** @typedef void (*nim_relogin_request_token_cb_func)(char** auth_token, uint32_t* length, const char* json_params, const void* user_data)
 * 登录时请求新的鉴权回调
 * @param[in] auth_token 新的 auth token
 * @param[in] token 的长度
 * @param[out] json_params 输出的json字符串内容
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_relogin_request_token_cb_func)(char** auth_token, uint32_t* length, const char* json_params, const void* user_data);

/** @typedef void (*nim_request_login_extension_cb_func)(char** auth_token, uint32_t* length, const char* json_params, const void* user_data)
 * 登录时请求第三方鉴权扩展信息回调
 * @param[in] auth_token 新的 auth token
 * @param[in] token 的长度
 * @param[out] json_params 输出的json字符串内容
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_request_login_extension_cb_func)(char** auth_token, uint32_t* length, const char* json_params, const void* user_data);

/** @enum NIMSDKLogLevel NIM SDK log级别，级别越高，log越详细 */
enum NIMSDKLogLevel {
    /// SDK Fatal级别Log
    kNIMSDKLogLevelFatal = 1,
    /// SDK Error级别Log
    kNIMSDKLogLevelError = 2,
    /// SDK Warn级别Log
    kNIMSDKLogLevelWarn = 3,
    /// SDK应用级别Log，正式发布时为了精简sdk log，可采用此级别
    kNIMSDKLogLevelApp = 5,
    /// SDK调试过程级别Log，更加详细，更有利于开发调试
    kNIMSDKLogLevelPro = 6,
};

/** @typedef void (*nim_sdk_log_cb_func)(int log_level, const char *log, const void *user_data)
 * 输出sdk log回调
 * @param[out] log_level log级别，见NIMSDKLogLevel
 * @param[out] log log内容
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_sdk_log_cb_func)(int log_level, const char* log, const void* user_data);

/** @enum NIMSDKException 异常 */
enum NIMSDKException {
    /// 当前数据目录所在盘符空间紧张或用完, log: {"free_space" : %lf, "message":""}, free_space单位M
    kNIMSDKExceptionSpaceEmpty = 1,
};
/** @typedef void (*nim_sdk_exception_cb_func)(enum NIMSDKException exception, const char *log, const void *user_data)
 * 输出当前环境异常回调
 * @param[out] exception 见NIMSDKException
 * @param[out] log 描述
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_sdk_exception_cb_func)(enum NIMSDKException exception, const char* log, const void* user_data);

/** @name 查询SDK文件缓存信息回调info结构定义
 * @{
 */
/// string,文件类型
static const char* kNIMCacheFileType = "file_type";
/// int,文件数量
static const char* kNIMCacheFileCount = "file_count";
/// string,文件所在文件夹路径
static const char* kNIMCacheFilePath = "file_path";
/// int64,文件总大小KB
static const char* kNIMCacheFileTotalSize = "total_size";
/** @}*/  // 查询SDK文件缓存信息回调info结构定义

/** @name 查询SDK文件缓存信息文件类型file_type
 * @{
 */
/// 杂项文件缓存
static const char* kNIMCacheFileOther = "res";
/// 图片消息缓存
static const char* kNIMCacheFileImage = "image";
/// 语音消息缓存
static const char* kNIMCacheFileAudio = "audio";
/// 视频消息缓存
static const char* kNIMCacheFileVideo = "video";
/** @}*/  // 查询SDK文件缓存信息文件类型file_type

/** @name 获取客户端灰度配置协议AppGrayConfigTag
 * @{
 */
/// bool, 是否开启融合存储
static const char* kNIMGrayMixStoreEnable = "mixStoreEnable";
/// bool, 是否开启测试
static const char* kNIMGrayTestEnable = "testEnbale";
/** @}*/

/** @typedef void (*nim_sdk_get_cache_file_info_cb_func)(const char *info, const void *user_data);
 * 获取sdk缓存文件信息回调
 * @param[out] info 信息
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_sdk_get_cache_file_info_cb_func)(const char* info, const void* user_data);

/** @typedef void (*nim_sdk_del_cache_file_cb_func)(enum NIMResCode rescode, const void *user_data);
 * 删除sdk缓存文件回调
 * @param[out] rescode 错误码
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_sdk_del_cache_file_cb_func)(enum NIMResCode rescode, const void* user_data);

/** @typedef void (*nim_sdk_feedback_cb_func)(enum NIMResCode rescode, const void *user_data);
 * SDK反馈回调
 * @param[out] rescode 错误码
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_sdk_feedback_cb_func)(enum NIMResCode rescode, const void* user_data);

/** @enum NIMDBOperation 对DB进行的操作类型 */
enum NIMDBOperation {
    /// 写操作
    kNIMDBOperationInsert = 0x0001,
    /// 读操作
    kNIMDBOperationRead = 0x0002,
    /// 更新操作
    kNIMDBOperationUpdate = 0x0004,
    /// 删除操作
    kNIMDBOperationDelete = 0x0008,
};
/** @name SDK DB操作出错时的反馈回调数据 error_info
 * @{
 */
/// 出错DB的名称
static const char* kNIMDBErrDBName = "db_name";
/// 出错DB的操作(读、写、更新、删除)
static const char* kNIMDBERROperation = "operation";
/// 错误码
static const char* kNIMDBErrCode = "error_code";
/// 相应的错误描述
static const char* kNIMDBErrDescription_ = "error_description";
/// 具体的出错信息
static const char* kNIMDBErrAttach = "error_attach";
/** @}*/  // SDK DB操作出错时的反馈回调数据 error_info

/** @typedef void (*nim_global_sdk_db_error_cb_func)(const char *error_info);
 * SDK DB操作出错时的反馈回调
 * @param[out] error_info 错误的相关信息
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_global_sdk_db_error_cb_func)(const char* error_info, const void* user_data);

/** @typedef void (*nim_global_upload_sdk_log_cb_func)(int rescode, const void* user_data)
 * 上传SDK日志回调
 * @param[out] rescode
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_global_upload_sdk_log_cb_func)(int rescode, const void* user_data);

/** @typedef typedef void (*nim_global_upload_sdk_log_cb_func)(int rescode, const char* download_url, const void* user_data)
 * @brief 上传SDK日志回调
 * @param[out] rescode 错误码
 * @param[out] download_url 下载地址
 * @param[out] user_data APP 的自定义用户数据，SDK 只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_global_upload_sdk_log_async_cb_func)(int rescode, const char* download_url, const void* user_data);

/** @enum NIMProxyDetectStep 代理测试步骤 */
enum NIMProxyDetectStep {
    /// 探测代理有效性结束
    kNIMProxyDetectStepAllComplete = 5,
};
/** @enum NIMProxyType 代理类型 */
enum NIMProxyType {
    /// 不使用代理
    kNIMProxyNone = 0,
    /// HTTP 1.1 Proxy（暂不支持）
    kNIMProxyHttp11 = 1,
    /// Socks4 Proxy
    kNIMProxySocks4 = 4,
    /// Socks4a Proxy
    kNIMProxySocks4a = 5,
    /// Socks5 Proxy
    kNIMProxySocks5 = 6,
    /// 云信音视频私有代理，只在nim_vchat_set_proxy中有效
    kNIMProxyNrtc = 10,
};
/** @typedef void (*nim_global_detect_proxy_cb_func)(bool network_connect, NIMProxyDetectStep step, const char *network_log, const void *user_data)
 * 探测代理回调
 * @param[out] network_connect 探测结果
 * @param[out] step 探测步骤
 * @param[out] json_params 输出的json字符串内容
 * @param[out] user_data APP的自定义用户数据，SDK只负责传回给回调函数，不做任何处理！
 * @return void 无返回值
 */
typedef void (*nim_global_detect_proxy_cb_func)(bool network_connect, enum NIMProxyDetectStep step, const char* json_params, const void* user_data);

#ifdef __cplusplus
};
#endif  //__cplusplus
#endif  // NIM_SDK_DLL_EXPORT_HEADERS_NIM_GLOBAL_DEF_H_
